import { defineStore } from 'pinia'
import { adminLogin, refreshAdminToken, getAdminInfo, logout } from '@/api/admin'

// 添加一个缓存的刷新Promise
let refreshTokenPromise = null

export const useAdminStore = defineStore('admin', {
  // 状态
  state: () => ({
    // 管理员信息
    adminInfo: null,
    // 管理员访问令牌
    accessToken: null,
    // 管理员令牌过期时间
    expiresIn: null,
    // 管理员权限列表
    permissions: []
  }),

  // 计算属性
  getters: {
    // 获取管理员名称
    adminName: (state) => state.adminInfo?.username || '未登录',
    // 获取管理员头像
    adminAvatar: (state) => state.adminInfo?.avatar || '/images/default-avatar.png',
    // 检查是否有特定权限
    hasPermission: (state) => (permission) => state.permissions.includes(permission),
    // 检查管理员token是否过期
    isTokenExpired: (state) => {
      // 如果有令牌但没有过期时间，默认认为未过期
      if (state.accessToken && !state.expiresIn) return false
      // 如果有过期时间，检查是否已过期
      if (state.expiresIn) return Date.now() >= state.expiresIn
      // 没有令牌，视为已过期
      return true
    },
    // 是否已登录
    isLoggedIn: (state) => !!state.accessToken && !!state.adminInfo
  },

  // 操作方法
  actions: {
    // 设置管理员信息
    setAdminInfo(adminInfo) {
      this.adminInfo = {
        ...adminInfo,
        isAdmin: true // 标记为管理员
      }
    },

    // 设置访问令牌
    setAccessToken(token, expiresIn) {
      this.accessToken = token
      // 设置过期时间（当前时间 + 过期时间）
      this.expiresIn = Date.now() + (expiresIn * 1000)
    },

    // 设置权限
    setPermissions(permissions) {
      this.permissions = permissions
    },

    // 管理员登录
    // 在 @/stores/modules/admin 中检查 login 方法
  async login(credentials) {
    try {
      console.log('调用登录API:', credentials)
      const response = await adminLogin(credentials)
      console.log('登录API响应:', response)
      
      const { accessToken, expires_in, roleId } = response
      
      // 设置管理员访问令牌和过期时间
      this.setAccessToken(accessToken, expires_in || 7200)
      
      // 设置管理员信息
      this.setAdminInfo(roleId)
      
      // 设置管理员权限
      if (roleId.permissions) {
        this.setPermissions(roleId.permissions)
      }
      
      console.log('登录状态设置完成')
      return true
    } catch (error) {
      console.error('管理员登录失败：', error)
      throw error // 确保抛出错误，让调用方能够捕获
    }
  },
    
    // 检查并刷新管理员token
    async checkAndRefreshToken() {
      // 如果没有管理员token，直接返回false
      if (!this.accessToken) {
        return false
      }

      // 如果token即将过期（比如还有5分钟过期），尝试刷新
      const fiveMinutes = 5 * 60 * 1000
      if (this.expiresIn && this.expiresIn - Date.now() < fiveMinutes) {
        return await this.refreshToken()
      }

      return true
    },
    
    // 刷新管理员令牌
    async refreshToken() {
      // 如果已经有一个刷新请求在进行中，直接返回该Promise
      if (refreshTokenPromise) {
        return refreshTokenPromise
      }
      
      // 创建新的刷新请求
      refreshTokenPromise = (async () => {
        try {
          // 调用刷新管理员token API
          const { accessToken, expires_in } = await refreshAdminToken()
          
          // 更新管理员访问令牌
          this.setAccessToken(accessToken, expires_in)
          
          return true
        } catch (error) {
          console.error('刷新管理员令牌失败：', error)
          //清除token
          this.accessToken = null
          this.expiresIn = null
          return false
        } finally {
          // 无论成功失败，都清除Promise缓存
          setTimeout(() => {
            refreshTokenPromise = null
          }, 1000) // 添加1秒延迟，防止短时间内多次调用
        }
      })()
      
      return refreshTokenPromise
    },
    
    // 获取管理员信息
    async fetchAdminInfo() {
      try {
        const adminInfo = await getAdminInfo()
        this.setAdminInfo(adminInfo)
        
        // 设置管理员权限
        if (adminInfo.permissions) {
          this.setPermissions(adminInfo.permissions)
        }
        
        return true
      } catch (error) {
        console.error('获取管理员信息失败：', error)
        return false
      }
    },
    
    // 管理员登出
    async logout() {
      try {
        // 调用登出API
        if (this.accessToken) {
          await logout()
        }
      } catch (error) {
        console.error('管理员登出失败：', error)
      } finally {
        // 清空管理员信息
        this.adminInfo = null
        this.accessToken = null
        this.expiresIn = null
        this.permissions = []
        // 重置刷新token的Promise
        refreshTokenPromise = null
      }
    }
  },

  // 持久化配置
  persist: {
    enabled: true,
    strategies: [
      {
        key: 'admin',
        storage: localStorage,
        paths: ['adminInfo', 'accessToken', 'expiresIn', 'permissions']
      }
    ]
  }
}) 